package com.sicong.codegen;

import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
import com.baomidou.mybatisplus.generator.config.GlobalConfig;
import com.baomidou.mybatisplus.generator.config.PackageConfig;
import com.baomidou.mybatisplus.generator.config.StrategyConfig;
import com.baomidou.mybatisplus.generator.config.po.TableFill;
import com.baomidou.mybatisplus.generator.config.rules.DateType;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;

import java.util.ArrayList;

public class CodeGenerator {

    public static void main(String[] args) {

        //代码构造器
        AutoGenerator mpg = new AutoGenerator();
        //配置策略

        //1、全局配置
        GlobalConfig gc = new GlobalConfig();
        //获取路径
        String projectPath = System.getProperty("user.dir");
        //设置目录
        gc.setOutputDir(projectPath + "/src/main/java");
        //设置作者
        gc.setAuthor("");
        //生成后是否打开文件夹
        gc.setOpen(false);
        //设置是否文件覆盖
        gc.setFileOverride(false);
        //设置Service名字，%s去除'I'前缀
        gc.setServiceName("%sService");
        //设置主键生成策略
        gc.setIdType(IdType.AUTO);
        //设置日期生成策略
        gc.setDateType(DateType.ONLY_DATE);
        //设置启用Swagger注解
        gc.setSwagger2(true);

        mpg.setGlobalConfig(gc);

        //2、设置数据源配置
        DataSourceConfig dsc = new DataSourceConfig();
        dsc.setUrl("jdbc:mysql://127.0.0.1:3306/base_system?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai");
        dsc.setDriverName("com.mysql.cj.jdbc.Driver");
        dsc.setUsername("root");
        dsc.setPassword("123456");
        dsc.setDbType(DbType.MYSQL);

        mpg.setDataSource(dsc);

        //3、包配置
        PackageConfig pc = new PackageConfig();
        //设置目录名
        pc.setParent("com.generator");
        //设置模块名
        //pc.setModuleName("app");
        //设置实体类文件夹名
        pc.setEntity("entity");
        //设置Service层文件夹名
        pc.setService("service");
        //设置Controller层文件夹名
        pc.setController("controller");

        mpg.setPackageInfo(pc);

        //4、策略配置
        StrategyConfig sc = new StrategyConfig();
        //驼峰命名
        sc.setCapitalMode(true);
        //包命名规则(下划线转驼峰命名)
        sc.setNaming(NamingStrategy.underline_to_camel);
        //列命名规则(下划线转驼峰命名)
        sc.setColumnNaming(NamingStrategy.underline_to_camel);
        //设置过滤的表前缀
        sc.setTablePrefix("sys_");
        //设置Lombok注解
        sc.setEntityLombokModel(true);
        sc.setChainModel(true);
        //生成逻辑删除的名字
        sc.setLogicDeleteFieldName("deleted");
        //配置自动填充
        TableFill gmtCreate = new TableFill("gmt_create", FieldFill.INSERT);
        TableFill gmtModified = new TableFill("gmt_modified", FieldFill.INSERT_UPDATE);
        ArrayList<TableFill> tableFills = new ArrayList<>();
        tableFills.add(gmtCreate);
        tableFills.add(gmtModified);
        sc.setTableFillList(tableFills);
        /**
         * 映射表名
         */
        sc.setInclude("sys_log");
        //乐观锁
//        sc.setVersionFieldName("version");
        //Controller使用Restful命名风格
        sc.setRestControllerStyle(true);
        //设置MappingHyphen链接请求风格
        sc.setControllerMappingHyphenStyle(true);

        mpg.setStrategy(sc);

        mpg.execute();
    }
}

